/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controller.Facade;

import Controller.*;
import Model.BD.DAO;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;

/**
 *
 * @author BBG
 */
public class ValidaFacade implements ValidaFacadeInterface {
    private SimpleDateFormat formatIso;
    private SimpleDateFormat formatBra;

    public DAO retornaDAO(Class classeBO) {
        try {
            Object obj1 = classeBO.newInstance();
            Method mtdDAO = classeBO.getMethod("getDAO");
            DAO dao = (DAO) mtdDAO.invoke(obj1);
            return dao;
        } catch (Exception e) {
            return null;
        }

    }

    public void validateCpf(FacesContext context, UIComponent component, Object value, Class classeBO, boolean parar) throws ValidatorException {

        FacesMessage msg = new FacesMessage("Erro");
        DAO dao = retornaDAO(classeBO);
        try {

            if (new Cpf().validarCPF((String) value)) {
                if (parar == false) {
                    if (!dao.consultarUmItem(component.getId(), (String) value).isEmpty()) {
                        msg.setSummary("*");
                        msg.setDetail("Cpf Já Cadastrado");
                        throw new ValidatorException(msg);
                    }
                }
            } else {
                msg.setSummary("*");
                msg.setDetail("CPF Inválido");
                throw new ValidatorException(msg);
            }
        } catch (Exception ex) {
            System.out.println(ex);
            throw new ValidatorException(msg);

        }

    }

    public void validateCnpj(FacesContext context, UIComponent component, Object value, Class classeBO, boolean parar) throws ValidatorException {

        DAO dao = retornaDAO(classeBO);

        FacesMessage msgCnpj = new FacesMessage("Verifique este campo");

        try {

            if (new Cnpj().validaCnpj((String) value)) {
                if (parar == false) {
                    if (!dao.consultarUmItem(component.getId(), (String) value).isEmpty()) {

                        msgCnpj.setSummary("*");
                        msgCnpj.setDetail("Valor Já Cadastrado");
                        throw new ValidatorException(msgCnpj);
                    }
                }
            } else {
                msgCnpj.setSummary("*");
                msgCnpj.setDetail("CNPJ Inválido");
                throw new ValidatorException(msgCnpj);
            }
        } catch (Exception ex) {
            throw new ValidatorException(msgCnpj);
        }

    }

    public void validateNum(FacesContext context, UIComponent component, Object value, Class classeBO, boolean parar) throws ValidatorException {
        FacesMessage msg = new FacesMessage();
        DAO dao = retornaDAO(classeBO);
        try {
            if (Integer.parseInt(value.toString()) <= 0.00) {
                msg.setSummary("*");
                msg.setDetail("Número Inválido");
                throw new ValidatorException(msg);
            }
        } catch (Exception ex) {
            msg.setDetail("Digite um valor maior que zero!");
            msg.setSummary("*");
            throw new ValidatorException(msg);
        }

    }

    public void validateNumeros(FacesContext context, UIComponent component, Object value, Class classeBO, boolean parar) throws ValidatorException {
        FacesMessage msg = new FacesMessage();
        DAO dao = retornaDAO(classeBO);
        try {
            if (Double.parseDouble(value.toString()) <= 0.0) {
                msg.setSummary("*");
                msg.setDetail("Número Inválido");
                throw new ValidatorException(msg);
            }
        } catch (Exception ex) {
            msg.setDetail("Digite um valor maior que zero!");
            msg.setSummary("*");
            throw new ValidatorException(msg);
        }

    }

    public void validateCampoUnico(FacesContext context, UIComponent component, Object value, Class classeBO, boolean parar) throws ValidatorException {

        DAO dao = retornaDAO(classeBO);
        if (parar == false) {
            FacesMessage msg = new FacesMessage();

            try {
                if (component.getId().equals("comboAssociado")) {
                    if (!dao.consultarUmItem("associado.codAssociado", value).isEmpty()) {
                        msg.setSummary("*");
                        msg.setDetail("Valor Já Cadastrado");
                        throw new ValidatorException(msg);
                    }

                } else {
                    if (!dao.consultarUmItem(component.getId(), value).isEmpty()) {
                        msg.setSummary("*");
                        msg.setDetail("Valor Já Cadastrado");
                        throw new ValidatorException(msg);
                    }
                }

            } catch (Exception e) {
               e.printStackTrace();
                throw new ValidatorException(msg);
            }
        }
    }
   public Date consertarData(Date data){
      data.setDate(data.getDate()+1);
      return data;
   }
   public Date diminuirData(Date data){
      data.setDate(data.getDate()-1);
      return data;
   }
   public void validateCpf2(FacesContext context, UIComponent component, Object value) throws ValidatorException {

        FacesMessage msg = new FacesMessage("Erro");
        try {

            if (new Cpf().validarCPF((String) value)){

            } else {
                msg.setSummary("*");
                msg.setDetail("CPF Inválido");
                throw new ValidatorException(msg);
            }
        }catch (Exception ex) {
            System.out.println(ex);
            throw new ValidatorException(msg);

        }
    }
   public void validaEmpresa(FacesContext context, UIComponent component, Object value) throws ValidatorException {
       FacesMessage msg = new FacesMessage("Erro");
       try{
           if(value.equals("0")){
                msg.setSummary("*");
                msg.setDetail("Selecione uma Empresa!");
                throw new ValidatorException(msg);
           }
        }catch (Exception ex) {
            System.out.println(ex);
            throw new ValidatorException(msg);

        }

   }

   public Double aproximarN(double x){
        BigDecimal bd = new BigDecimal(x);
        bd = bd.setScale(2,BigDecimal.ROUND_HALF_UP);
        return bd.doubleValue();
   }
}
